package cloud.xiangyixiang.www.spring.boot.java.basics.controller;


import cloud.xiangyixiang.www.spring.boot.java.basics.pojo.bo.StudentAnonymousInnerClass;
import cloud.xiangyixiang.www.spring.boot.java.basics.pojo.bo.TeacherInnerClass;
import cloud.xiangyixiang.www.spring.boot.java.basics.pojo.bo.TeacherLocalInnerClass;

/**
 * <p>
 * JAVA Inner Class 内部类
 * </p>
 *
 * @author zhixinglu
 * @date 2023/9/13 17:33
 */
public class InnerClassController {

    public static void main(String[] args) {
        description();

        test1();

        test2();

        test3();

        test4();

        test5();
    }

    /**
     * 详情介绍
     */
    private static void description(){
        System.out.println("详情介绍：======================");

        System.out.println("内部类是定义在另一个类中的类。");
        System.out.println("  1. 内部类可以对同一个包中的其它类隐藏；");
        System.out.println("  2. 内部类方法可以访问定义这些方法的作用域中的数据，包括原本私有的数据。");

        System.out.println("内部类的对象会有一个隐式引用，指向实例化这个对象的外部类对象。通过这个指针，它可以访问外部对象的全部状态。比如，Iterator类不需要它所指的LinkedList的一个显示指针。");

        System.out.println("内部类分为四种：");
        System.out.println(" 1.成员内部类");
        System.out.println(" 2.局部内部类");
        System.out.println(" 3.匿名内部类");
        System.out.println(" 4.静态内部类");

        System.out.println();
    }

    /**
     * 成员内部类
     */
    private static void test1(){
        System.out.println("成员内部类：================");

        TeacherInnerClass teacherInnerClass = new TeacherInnerClass();
        teacherInnerClass.speak();

        System.out.println();
    }

    /**
     * 成员内部类，进阶版
     */
    private static void test2(){
        System.out.println("成员内部类，进阶版：===============");

        TeacherInnerClass teacherInnerClass = new TeacherInnerClass();
        teacherInnerClass.speak2();

        System.out.println();
    }

    /**
     * 外部类访问内部类
     */
    private static void test3(){

        System.out.println("外部类访问内部类:==================");

        TeacherInnerClass teacherInnerClass = new TeacherInnerClass();
        TeacherInnerClass.Student3 student3 = teacherInnerClass.new Student3();
        student3.speak();

        System.out.println();
    }

    /**
     * 局部内部类
     */
    private static void test4(){
        System.out.println("局部内部类:==============");
        TeacherLocalInnerClass teacherLocalInnerClass = new TeacherLocalInnerClass();
        System.out.println();
    }

    /**
     * 匿名内部类
     */
    private static void test5(){
        System.out.println("匿名内部类：===============");

        StudentAnonymousInnerClass student = new StudentAnonymousInnerClass();
        student.work();

        System.out.println();
    }
}
